package com.mjp.learn.multi.basic;

import java.util.ArrayList;
import java.util.List;

/**
 * volatile关键字
 * 作用:保证变量的线程之间的可见性,禁止指令重排序
 *
 * 但是volatile 不能保证原子性
 * 如果要保证原子性，那么在run方法块上加sychronized
 */
public class Demo08 implements Runnable{
    static volatile Integer count = 0 ;
    private static final Object object = new Object();
    @Override
    public void run() {

        //保证原子性的代码块
        for(int i = 0 ; i < 10000;i++){
            synchronized (object){
                count++;
            }
        }
        System.out.println(Thread.currentThread().getName()+":end!");

//        如果不加sychronized 则不能保证原子性
//        for(int i = 0 ; i < 10000;i++){
//            count++;
//        }
//        System.out.println(Thread.currentThread().getName()+":end!");
    }

    public static void main(String[] args) throws InterruptedException {
        List<Thread> arr = new ArrayList<>();
        for(int i = 0 ; i < 10;i++){
            Thread thread = new Thread(new Demo08());
            thread.start();
            arr.add(thread);
        }
        for(Thread thread:arr){
            thread.join();
        }
        System.out.println(count);
    }
}
